package com.longrise.android.downloadImage;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

public class BitmapManager {
	/**
	 * 按屏幕适配Bitmap
	 */
	public static Bitmap scaleBitmap(Context context, byte[] data, float percent)
	{

		// 这里我不获取了，假设是下面这个分辨率
		int screenWidth = 320;
		int screenrHeight = 480;
		// 设置 options
		BitmapFactory.Options options = new BitmapFactory.Options();
		/**
		 * BitmapFactory.Options这个类，有一个字段叫做 inJustDecodeBounds.SDK中对这个成员的说明是这样的：
		 * If set to true, the decoder will return null (no bitmap), but the
		 * out… 也就是说，如果我们把它设为true，那么BitmapFactory.decodeFile(String path,
		 * Options opt)并不会真的返回一个Bitmap给你，
		 * 它仅仅会把它的宽，高取回来给你，这样就不会占用太多的内存，也就不会那么频繁的发生OOM了。
		 */
		options.inJustDecodeBounds = true;

		// 读取
		Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length,
				options);
		
		int imgWidth = options.outWidth;
		int imgHeight = options.outHeight;

		
		// 如果比你设置的宽高大 就进行缩放，
		if (imgWidth > screenWidth * percent || imgHeight > screenrHeight * percent) 
		{
			options.inSampleSize = calculateInSampleSize(options, screenWidth,
					screenrHeight, percent);
		}

		/**
		 * If set to true, the decoder will return null (no bitmap), but the
		 * out... fields will still be set, allowing the caller to query the
		 * bitmap without having to allocate the memory for its pixels.
		 * 
		 * 如果设置成 true，这个编码将会返回1个null ， 但是那个区域仍将被设置（也就是存在），允许（调用者）去查询那个没有分配 内存的像素
		 * bitmap
		 */
		options.inJustDecodeBounds = false;

		/**
		 * Android的Bitmap.Config给出了bitmap的一个像素所对应的存储方式，
		 * 有RGB_565，ARGB_8888，ARGB_4444
		 * ，ALPHA_8四种。RGB_565表示的是红绿蓝三色分别用5,6,5个比特来存储，
		 * 一个像素占用了5+6+5=16个比特。ARGB_8888表示红绿蓝和半透明分别用8,8,8,8个比特来存储，
		 * 一个像素占用了8+8+8+8=32个比特。这样的话如果图片是以RGB_8888读入的，那么占用内存的大小将是RGB_565读入方式的2倍。
		 * 通常我们给Imagview加载图片是通过setDrawable或者在xml文件中用android:src来设置
		 * 默认的加载图片大小的方式是以RGB_8888读入的。
		 * 
		 */
		options.inPreferredConfig = Bitmap.Config.RGB_565;

		/**
		 * If this is set to true, then the resulting bitmap will allocate its
		 * pixels such that they can be purged if the system needs to reclaim
		 * memory.
		 * 
		 * 如果设置成 true， 这个结果bitmap 将会被分配像素，这样他们就能被 系统回收了，当系统需要回收内存的时候
		 */
		options.inPurgeable = true;

		/**
		 * This field works in conjuction with inPurgeable. 这个方法是在 inPurgeable
		 * 的基础上工作的
		 */
		options.inInputShareable = true;

		bitmap = BitmapFactory.decodeByteArray(data, 0, data.length, options);

		return bitmap;
	}

	// options reqWidth 屏幕宽 reqHeight屏幕高 你的view是屏幕的多大
	public static int calculateInSampleSize(BitmapFactory.Options options,
			int screenWidth, int screenHeight, float percent)
	{

		// 原始图片宽高
		final int height = options.outHeight;
		final int width = options.outWidth;
		// 倍数
		int inSampleSize = 1;

		if (height > screenHeight * percent || width > screenWidth * percent)
		{

			// 计算目标宽高与原始宽高的比值
			final int inSampleSize_h = Math.round((float) height
					/ (float) (screenHeight * percent));

			final int inSampleSize_w = Math.round((float) width
					/ (float) (screenWidth * percent));

			// 选择两个比值中较小的作为inSampleSize的
			inSampleSize = inSampleSize_h < inSampleSize_w ? inSampleSize_h
					: inSampleSize_w;

			System.out.println("inSampleSize====" + inSampleSize);
			//
			if (inSampleSize < 1)
			{
				inSampleSize = 1;
			}
		}
		// 简单说这个数字就是 缩小为原来的几倍，根据你的image需要占屏幕多大动态算的（比如你用的权重设置layout）
		return inSampleSize;
	}
}
